package com.pe.pgn.clubpgn.domain;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.apache.commons.collections.FactoryUtils;
import org.apache.commons.collections.ListUtils;
import org.hibernate.annotations.Type;
import org.springframework.format.annotation.DateTimeFormat;

import com.pe.pgn.clubpgn.domain.beans.BNCatalogoDetalle;

/**
 * @author Edwin Farfan
 */

@Entity
@Table(name = "clpm_catalogo")
public class ClpmCatalogo extends CamposAuditoria{
	

	private static final long serialVersionUID = 3913034397891953606L;
	private Long id;
	private ClpdTipoTarjetaPersona clpdTipoTarjetaPersona = new ClpdTipoTarjetaPersona();
	private String deCatalogo;
	private Calendar daInicioVigencia;
	private Calendar daFinCanje;
	private Boolean stCatalogo;
	private String coCodigoCatalogo;
	private String deReferencia1;
	private String deReferencia2;
	private String deObservaciones;
	private String inicioVigencia;
	private String finCanje;
	private String deTipoTarjetaPersona;
	
	private List<BNCatalogoDetalle> catalogoDetalle;
	
	@SuppressWarnings("unchecked")
    public ClpmCatalogo() {
    	this.catalogoDetalle = ListUtils.lazyList(
    	  		new ArrayList<BNCatalogoDetalle>(),
    	  		FactoryUtils.instantiateFactory(BNCatalogoDetalle.class));
	}

	@Id
    @Column(name="id")
    @SequenceGenerator(name="seqcatalogo", sequenceName="seq_catalogo")
    @GeneratedValue(generator="seqcatalogo")
    public Long getId() {
		return id;
	}

    @ManyToOne(cascade = CascadeType.ALL, targetEntity = ClpdTipoTarjetaPersona.class)
    @JoinColumn(name="co_tipo_tarjeta_persona")
	public ClpdTipoTarjetaPersona getClpdTipoTarjetaPersona() {
		return clpdTipoTarjetaPersona;
	}

    @Column(name = "de_catalogo")
	public String getDeCatalogo() {
		return deCatalogo;
	}

    @Column(name = "da_inicio_vigencia")
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "S-")
	public Calendar getDaInicioVigencia() {
		return daInicioVigencia;
	}


    @Column(name = "da_fin_canje")
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "S-")
	public Calendar getDaFinCanje() {
		return daFinCanje;
	}

    @Column(name = "st_catalogo", nullable = false)
	@Type(type = "yes_no") 
	public Boolean getStCatalogo() {
		return stCatalogo;
	}

    @Column(name = "co_codigo_catalogo")
	public String getCoCodigoCatalogo() {
		return coCodigoCatalogo;
	}

    @Column(name = "de_referencia_1")
	public String getDeReferencia1() {
		return deReferencia1;
	}

    @Column(name = "de_referencia_2")
	public String getDeReferencia2() {
		return deReferencia2;
	}

    @Column(name = "de_observaciones")
	public String getDeObservaciones() {
		return deObservaciones;
	}

	
	@Column(name = "co_usuario_creador", updatable = false, nullable = false, length = 30)
	public String getCoUsuarioCreador() {
		return coUsuarioCreador;
	}

    @Column(name = "da_fecha_creacion", updatable = false, nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "S-")
	public Calendar getDaFechaCreacion() {
		return daFechaCreacion;
	}

	@Column(name = "co_usuario_modificador", length = 30)
	public String getCoUsuarioModificador() {
		return coUsuarioModificador;
	}

    @Column(name = "da_fecha_modificacion")
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "S-")
	public Calendar getDaFechaModificacion() {
		return daFechaModificacion;
	}
    

    
    @Override
	public int hashCode() {
		final int prime = 31;
		int result = 17;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
            return true;
        }
        if (!(obj instanceof ClpmCatalogo)) {
            return false;
        }

        final ClpmCatalogo cat = (ClpmCatalogo) obj;

        return !(id != null ? !id.equals(cat.id) : cat.id != null);

	}

	

	@Override
	public String toString() {
		return this.deCatalogo;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setClpdTipoTarjetaPersona(
			ClpdTipoTarjetaPersona clpdTipoTarjetaPersona) {
		this.clpdTipoTarjetaPersona = clpdTipoTarjetaPersona;
	}

	public void setDeCatalogo(String deCatalogo) {
		this.deCatalogo = deCatalogo;
	}

	public void setDaInicioVigencia(Calendar daInicioVigencia) {
		this.daInicioVigencia = daInicioVigencia;
	}


	public void setDaFinCanje(Calendar daFinCanje) {
		this.daFinCanje = daFinCanje;
	}

	public void setStCatalogo(Boolean stCatalogo) {
		this.stCatalogo = stCatalogo;
	}

	public void setCoCodigoCatalogo(String coCodigoCatalogo) {
		this.coCodigoCatalogo = coCodigoCatalogo;
	}

	public void setDeReferencia1(String deReferencia1) {
		this.deReferencia1 = deReferencia1;
	}

	public void setDeReferencia2(String deReferencia2) {
		this.deReferencia2 = deReferencia2;
	}

	public void setDeObservaciones(String deObservaciones) {
		this.deObservaciones = deObservaciones;
	}

	@Transient
	public String getInicioVigencia() {
		return inicioVigencia;
	}

	public void setInicioVigencia(String inicioVigencia) {
		this.inicioVigencia = inicioVigencia;
	}



	@Transient
	public String getFinCanje() {
		return finCanje;
	}

	public void setFinCanje(String finCanje) {
		this.finCanje = finCanje;
	}

	@Transient
	public List<BNCatalogoDetalle> getCatalogoDetalle() {
		return catalogoDetalle;
	}

	public void setCatalogoDetalle(List<BNCatalogoDetalle> catalogoDetalle) {
		this.catalogoDetalle = catalogoDetalle;
	}
	
	@Transient
	public String getDeTipoTarjetaPersona() {
		return deTipoTarjetaPersona;
	}

	public void setDeTipoTarjetaPersona(String deTipoTarjetaPersona) {
		this.deTipoTarjetaPersona = deTipoTarjetaPersona;
	}
}
